﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Entidades.Seguridad;
using Entidades.Sistema.Base;
using Entidades.Sistema.Venta;
using Modelo.Sistema.Base;
using Modelo.Sistema.Venta;
using DevExpress.Web.Mvc;

namespace VistaOnlineR1._1.Controllers.Sistema.Venta
{
    public class ClienteController : BaseController
    {
        #region campos
        CatalogoCliente _catalogoCliente;
        CatalogoTipoCliente _catalogoTipoCliente;
        CatalogoCondicionIva _catalogoCondicionIva;
        CatalogoBarrio _catalogoBarrio;
        CatalogoLocalidad _catalogoLocalidad;
        CatalogoProvincia _catalogoProvincia;
        CatalogoPedidos _catalogoPedidos;
        #endregion

        #region Constructors
        public ClienteController()
            : this(new CatalogoCliente(), new CatalogoTipoCliente(), new CatalogoCondicionIva(), new CatalogoBarrio(), new CatalogoLocalidad(), new CatalogoProvincia(), new CatalogoPedidos())
        {
        }

        public ClienteController(CatalogoCliente catalogoClientes, CatalogoTipoCliente catalogoTipoCliente, CatalogoCondicionIva catalogoCondicionIva, CatalogoBarrio catalogoBarrio, CatalogoLocalidad catalogoLocalidad, CatalogoProvincia catalogoProvincia, CatalogoPedidos catalogoPedidos)
        {
            _catalogoCliente = catalogoClientes;
            _catalogoTipoCliente = catalogoTipoCliente;
            _catalogoCondicionIva = catalogoCondicionIva;
            _catalogoBarrio = catalogoBarrio;
            _catalogoLocalidad = catalogoLocalidad;
            _catalogoProvincia = catalogoProvincia;
            _catalogoPedidos = catalogoPedidos; ;
        }
        #endregion

        public ActionResult Index()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();

            return View(_catalogoCliente.ListarCliente());
        }
        [ValidateInput(false)]
        public ActionResult EditClientesPartial()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            return PartialView("EditClientesPartial", _catalogoCliente.ListarCliente());
        }


        [HttpGet]
        public ActionResult EditClientesUpdatePartial(int idCliente)
        {
            Cliente editCliente = _catalogoCliente.BuscarCliente(idCliente);
            if (editCliente == null)
            {
                editCliente = new Cliente();
                editCliente.IdCliente = -1;
            }
            
            ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();
            
            return View("EditingFormTab", editCliente);
        }

        public ActionResult EditingForm(Cliente Cliente)
        {

            Cliente editCliente = Cliente;

            if (editCliente == null)
            {
                editCliente = new Cliente();
                editCliente.IdCliente = -1;
            }

            ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            return View("EditingForm", editCliente);
        }


        [HttpPost, ValidateInput(false)]
        public ActionResult EditClientesUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))]Cliente cliente)
        {
            ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            bool validaok = true;

            //int IdTipoCliente = String.IsNullOrEmpty(Request.Params["IdTipoCliente"]) ? -1 : int.Parse(Request.Params["IdTipoCliente_VI"]);

            //if (IdTipoCliente != -1)
            //{ cliente.TipoCliente = _catalogoTipoCliente.BuscarTipoCliente(IdTipoCliente); }
            //else { ModelState.AddModelError("IdTipoCliente", "Seleccione tipo de cliente"); validaok = false; }

            int IdBarrio = String.IsNullOrEmpty(Request.Params["Barriox_VI"]) ? -1 : int.Parse(Request.Params["Barriox_VI"]);

            if (IdBarrio != -1)
            { cliente.Barrio = _catalogoBarrio.BuscarBarrio(IdBarrio); }
            else
            { ModelState.AddModelError("IdBarrio", "Seleccione un barrio"); validaok = false; }

            //int IdCondicionIva = String.IsNullOrEmpty(Request.Params["IdCondicionIva"]) ? -1 : int.Parse(Request.Params["IdCondicionIva_VI"]);

            //if (IdCondicionIva != -1)
            //{ cliente.CondicionIva = _catalogoCondicionIva.BuscarCondicionIva(IdCondicionIva); }
            //else
            //{ ModelState.AddModelError("IdCondicionIva", "Seleccione condicion IVA"); validaok = false; }



            if (ModelState.IsValid)
            {
                try
                {
                    int idTipoCliente = String.IsNullOrEmpty(Request.Params["IdTipoCliente_VI"]) ? -1 : int.Parse(Request.Params["IdTipoCliente_VI"]);
                    int idCondicionIva = String.IsNullOrEmpty(Request.Params["IdCondicionIva_VI"]) ? -1 : int.Parse(Request.Params["IdCondicionIva_VI"]);
                    int idBarrio = String.IsNullOrEmpty(Request.Params["Barriox_VI"]) ? -1 : int.Parse(Request.Params["Barriox_VI"]);

                    if (idTipoCliente != -1)
                    { cliente.TipoCliente = _catalogoTipoCliente.BuscarTipoCliente(idTipoCliente); }
                    if (idCondicionIva != -1)
                    { cliente.CondicionIva = _catalogoCondicionIva.BuscarCondicionIva(idCondicionIva); }
                    if (idBarrio != -1)
                    { cliente.Barrio = _catalogoBarrio.BuscarBarrio(idBarrio); }

                    string auditoria = User.Identity.Name;

                    if (cliente.IdCliente == -1)
                        _catalogoCliente.AgregarCliente(cliente);
                    else
                        _catalogoCliente.ModificarCliente(cliente);

                    return RedirectToAction("Index");
                }
                catch (Exception e)
                {
                    ViewData["EditError"] = e.Message;
                    return View("EditingFormTab", cliente);
                }
            }
            else
                ViewData["EditError"] = "Por Favor, modifica los errores.";
                return View("EditingFormTab", cliente);


            //if (!ModelState.IsValid )
            //{

            //    if (validaok == false)
            //    {
            //    ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
            //    ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
            //    ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            //    ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            //    ViewBag.Barrio = _catalogoBarrio.ListarBarrio();
            //    ViewData["EditError"] = "error chabon";
            //    return View("EditingFormTab", cliente);
            //    }
            //}


            //int idTipoCliente = String.IsNullOrEmpty(Request.Params["IdTipoCliente_VI"]) ? -1 : int.Parse(Request.Params["IdTipoCliente_VI"]);
            //int idCondicionIva = String.IsNullOrEmpty(Request.Params["IdCondicionIva_VI"]) ? -1 : int.Parse(Request.Params["IdCondicionIva_VI"]);
            //int idBarrio = String.IsNullOrEmpty(Request.Params["Barriox_VI"]) ? -1 : int.Parse(Request.Params["Barriox_VI"]);

            //if (idTipoCliente != -1)
            //    { cliente.TipoCliente = _catalogoTipoCliente.BuscarTipoCliente(idTipoCliente);  }
            //if (idCondicionIva != -1)
            //    { cliente.CondicionIva = _catalogoCondicionIva.BuscarCondicionIva(idCondicionIva); }
            //if (idBarrio != -1)
            //    { cliente.Barrio = _catalogoBarrio.BuscarBarrio(idBarrio); }

            //string auditoria = User.Identity.Name;

            //if (cliente.IdCliente == -1)
            //    _catalogoCliente.AgregarCliente(cliente);
            //else
            //    _catalogoCliente.ModificarCliente(cliente);           

                ViewBag.TipoClientes = _catalogoTipoCliente.ListarTipoCliente();
                ViewBag.CondicionIva = _catalogoCondicionIva.ListarCondicionIva();
                ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
                ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
                ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            return RedirectToAction("Index");
        }
        public ActionResult EditClientesDeletePartial(int idCliente)
        {

            bool rta = _catalogoPedidos.buscarPedidosxCliente(idCliente);

            if (rta == true)
            {
                ViewBag.Estado = "El cliente tiene pedidos asociados";
                return View();
            }

            _catalogoCliente.EliminarCliente(_catalogoCliente.BuscarCliente(idCliente));
            return RedirectToAction("Index");
        }

        public ActionResult ComboBoxLocalidadPartial()
        {
            int provinciaId = String.IsNullOrEmpty(Request.Params["Provincia"]) ? -1 : int.Parse(Request.Params["Provincia"]);
            
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            Cliente editCliente = new Cliente();
            editCliente.IdCliente = -1;
            editCliente.IdProvincia = provinciaId;
            editCliente.Barrio.Localidad.Provincia.IdProvincia = provinciaId;

            return PartialView(editCliente);
        }

        public ActionResult ComboBoxBarrioPartial()
        {
            int localidadId = String.IsNullOrEmpty(Request.Params["Localidad"]) ? -1 : int.Parse(Request.Params["Localidad"]);
            
            ViewBag.Provincia = _catalogoProvincia.ListarProvincia();
            ViewBag.Localidad = _catalogoLocalidad.ListarLocalidad();
            ViewBag.Barrio = _catalogoBarrio.ListarBarrio();

            Cliente editCliente = new Cliente();
            editCliente.IdCliente = -1;
            editCliente.IdLocalidad = localidadId;
            editCliente.Barrio.Localidad.IdLocalidad = localidadId;

            return PartialView(editCliente);
        }
    }
}